package Invaders;

import java.awt.*;
import java.util.Random;
import javax.swing.ImageIcon;
import Objects.Shooter;

// Esta classe representa um invasor (UFO) no jogo.
public class Invader {
	// Posição e "velocidade" do UFO em pixels.  
	protected int x,y;
	protected int dx,dy;
	protected boolean estaAtivo;
	// Tamanho do UFO em pixels.
	protected int iw,ih;
	// Imagem do UFO.
	protected Image icon;
	// Area do painel do jogo (para controlar movimento).  
	protected Dimension area;
	// Raio de Colisao
	protected int raioColisao = 30;
	protected int raioColisao1 = 12;
	protected int raioColisao2 = 10;
	protected int score;
	protected int life;
	protected double dano;
  
  // Construtor, inicializa atributos e posiciona o UFO.
	public Invader(Dimension a) {
		score = 10;
	    area = a;
	    icon = new ImageIcon(getClass().getResource("/Sprites/invaderyellow.gif")).getImage();
	    //icon = new ImageIcon(getClass().getResource("/Sprites/ufoa.png")).getImage();
	    iw = icon.getWidth(null);
	    ih = icon.getHeight(null);
	    // x e y calculados usando a área do jogo.
	    x = (int)(Math.random()*(a.width-iw));
	    y = (int)(Math.random()*(a.height-300-ih));
	    // dx e dy alearios.
	    while(dx == 0 || dy == 0) {
	    	Random random = new Random();
	    	dx = random.nextInt(2)+1;
	    	dy = random.nextInt(2)+1;
    	}
	    estaAtivo = true;
	    life = 1;
	    dano = 0.5;
    }
  
  // Método que movimenta o UFO, verificando se está na área válida.
	public void move() {
	    if (estaAtivo) {
	    	x += dx;
	    	y += dy;
	    	if (x < 0) { 
	    		dx = -dx; 
	    		x += dx; 
    		} 
	    	if (y < 0) { 
	    		dy = -dy; 
	    		y += dy; 
    		} 
	    	if (x > area.width-iw) { 
	    		dx = -dx; 
	    		x += dx; 
    		} 
	    	if (y > area.height-ih) { 
	    		dy = -dy; 
	    		y += dy; 
    		}
    	}
    }
  
	// Método que desenha o UFO em um contexto gráfico. 
	public void draw(Graphics g)	{
		if (estaAtivo) {
			g.drawImage(icon,x,y,null);
		}
    }

	public void desativa() {
		estaAtivo = false;
    }
  
	public boolean estaAtivo() { 
		return estaAtivo; 
	}
	
	public int getX() { 
		return x; 
	}
	
	public int getY() { 
		return y; 
	}
  
  	public boolean acertouEm(Shooter i) {
  		int ox = i.getXm(); 
  		int oy = i.getYm();
  		int xm = getXm(); 
  		int ym = getYm();
		  if (Math.sqrt((xm-ox)*(xm-ox)+(ym-oy)*(ym-oy)) < 30) {
			  return true;
		  }
		  return false;
  	}

  // X medio da imagem para colisao
  	public int getXm() {
  		return x + 50;
  	}
  
  	// Y medio da imagem para colisao
  	public int getYm() {
  		return y + 50;
  	}
  
  	public int getXm1() {
  		return x + 20;
  	}
  
  	public int getYm1() {
  		return y + 50;
  	}
  
  	public int getXm2() {	
  		return x + 82;
  	}
  
  	public int getYm2() {
  		return y + 50;
  	}
  
  	public int getXm3() {
  		return x + 50;
  	}
  	
  	public int getYm3() {
  		return y + 82;
  	}

  	public int getRaioColisao() {
  		return raioColisao;
  	}
  
  	public int getScore() {
		  return score;
  	}
  
  	public void perdeLife() {
  		life--;
  		if(life == 0) desativa();
  	}
  	
  	public void perdeLife(int dano) {
  		life-=dano;
  		if(life <= 0) desativa();
  	}
  
  	public double causaDano() {
  		return dano;
  	}
  
	public int getRaioColisao1() {
		return raioColisao1;
	}
	
	public int getRaioColisao2() {
		return raioColisao2;
	}
}